/*
优化上一个程序中出现的bug
比如：2 3 4 6
上个代码中存在下面的这种情况：4 * 6 + 2 / 3
所以存在一定问题
另外加入了一些输入格式的控制，使操作更合理化
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define INF 24

using namespace std;

/// 用来存储两个数的计算结果和计算的过程
struct data
{
    /// 记录两个位置运算的结果
    int sum;
    /// 记录两个位置
    int x;
    int y;
    /// 记录两个数计算的符号
    char str;
} pre[50];
/// 存储输入的四个数
int a[4];

char s[4] = {'+', '-', '*', '/'};

string str[50];

int main()
{
    printf("是否进入24点游戏：Y|N？？\n");
    char c;
    while(cin >> c)
    {
        if(c == 'Y')
            printf("请输入（1 ~ 10）之前的四个数\n");
        else
            break;
        memset(a, 0, sizeof(a));
        for(int i = 0; i < 4; i ++)
            cin >> a[i];
        int num = 0;
        for(int i = 0; i < 4; i ++)
            for(int j = 0; j < 4; j ++)
            {
                /// 上面是取出两个数

                if(i == j)
                    continue;
                /// 进行四种符号的选择
                for(int k = 0; k < 4; k ++)
                {
                    /// 每次都把对应的计算结果，取的两个数在a数组中的位置以及运算的符号都保存到结构体中
                    if(s[k] == '+')
                    {
                        pre[num].sum = a[i] + a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '+';
                    }
                    else if(s[k] == '-')
                    {
                        pre[num].sum = a[i] - a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '-';
                    }
                    else if(s[k] == '*')
                    {
                        pre[num].sum = a[i] * a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '*';
                    }
                    else if(s[k] == '/')
                    {
                        /// 注意分母不能为0
                        if(a[j] == 0)
                            continue;
                        /// 两个数相除的余数必须为0
                        if(a[i] % a[j] != 0)
                            continue;
                        pre[num].sum = a[i] / a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '/';
                    }
                }
            }

        /// 用来判断是否已经输出
        bool flag = 0;

        for(int i = 0; i < num; i ++)
            for(int j = 0; j < num; j ++)
            {
                if(i == j)
                    continue;
                /// 判断是否一个数被多次使用
                if(pre[i].x != pre[j].x && pre[i].x != pre[j].y && pre[i].y != pre[j].x && pre[i].y != pre[j].y)
                {
                    for(int k = 0; k < 4; k ++)
                    {
                        if(s[k] == '+')
                        {
                            int sum = pre[i].sum + pre[j].sum;
                            if(sum == INF)
                            {
                                printf("%d %c %d %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                /// 记录存在结果为24的情况
                                flag = 1;
                            }
                        }
                        else if(s[k] == '-')
                        {
                            int sum = pre[i].sum - pre[j].sum;
                            if(sum == INF)
                            {
                                printf("%d %c %d %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                flag = 1;
                            }
                        }
                        /// 如果是乘除的时候要进行判断两端计算的是否是加减，是的话要加括号
                        else if(s[k] == '*')
                        {
                            int sum = pre[i].sum * pre[j].sum;
                            if(sum == INF)
                            {
                                if((pre[i].str == '+' || pre[i].str == '-') && (pre[j].str == '+' || pre[j].str == '-'))
                                    printf("(%d %c %d) %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                else if(pre[i].str == '+' || pre[i].str == '-')
                                    printf("(%d %c %d) %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                else if(pre[j].str == '+' || pre[j].str == '-')
                                    printf("%d %c %d %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                flag = 1;
                            }
                        }
                        else if(s[k] == '/')
                        {
                            if(pre[j].sum == 0)
                                continue;
                            if(pre[i].sum % pre[j].sum != 0)
                                continue;
                            int sum = pre[i].sum / pre[j].sum;
                            if(sum == INF)
                            {
                                if((pre[i].str == '+' || pre[i].str == '-') && (pre[j].str == '+' || pre[j].str == '-'))
                                    printf("(%d %c %d) %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                else if(pre[i].str == '+' || pre[i].str == '-')
                                    printf("(%d %c %d) %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                else if(pre[j].str == '+' || pre[j].str == '-')
                                    printf("%d %c %d %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                flag = 1;
                            }
                        }
                    }
                }
            }

        if(!flag)
            printf("不存在\n");
        printf("请选择是否继续：Y|N？？\n");
    }
    return 0;
}
